#import "../template.typ" as template

#show: it => template.main(
  it
)

#let gap = 5pt

#{
  let figmax = 70%

  set align(center)

  text(weight: "light", stroke: 0.01pt)[(CVPR 2024，图像分类)]

  v(gap)
  image("assets/main/figures/title.png", height: 30% * figmax)
  v(gap)
  image("assets/main/figures/fig1.png", height: 70% * figmax)
  v(gap)

  [Ma等人#ref(<2024-cvpr-star>)证明了逐像素相乘操作能够将特输入特征映射到一个非常高维度的非线性空间。]
}

#pagebreak()

#{
  set align(horizon)
  grid(
    columns: (auto, 40%),
    gutter: 1em,
    grid(
      rows: 3,
      gutter: 1.5em,
      [
        = 动机

        - 目前研究发现，相比于相加操作，采用star operation能够取得更好的性能
        - 但是这一现象缺乏合理解释
      ],
      [
        = 方法

        - 对star operation进行重写，发现star operation能够产生一个新的特征空间，
         此特征空间含有约 $(d / sqrt(2))^2$个线性无关的维度
        - 发现star operation作用是跨通道进行特征相乘
        - 进一步提出DemoNet和StarNet进行实验
      ],
      [
        = 结论

        - 此工作证明了star operation的其中一个代表性能力是，
         能够将特输入特征映射到一个非常高维度的非线性空间。这个作用与多项式核函数类似
        - StarNet在移动平台上能达到更高精度，并且速度更快
      ]
    ),
    [
      #figure(
        image("assets/main/figures/fig1.png"),
        caption: [此工作采用Demo block(左)搭建了一个DemoNet用于验证理论，并后续搭建了StarNet用于对比实验]
      ) <fig:demoblock>
    ]
  )
}


#let pb = [
  #pagebreak()

  = 单层star operation
]


#pb

假设目前有一个单层的star operation的情况：

$
(W_(1)^(T)X + B_(1)) * (W_(2)^(T)X + B_(2))
$

其中，$W = mat(delim: "[", W; B)$，$X = mat(delim: "[", X; 1)$

假设单输入元素，并且输出通道为1，则可定义$w_(1), w_(2), x in RR^((d + 1) times 1)$，$d$是输入通道数，

则$W_(1), W_(2) in RR^((d + 1) times (d' + 1))$，$X in RR^((d + 1) times n)$

基于此，start operation可以被重写为：

#let img = "assets/main/figures/eq1-eq4.png"

#align(center, image(img, width: 50%))

#pb

#let width = 63%

#align(center, image(img, width: width))

用$i$和$j$作为索引，$alpha$是上式中每个项的系数，则：

#align(center, image("assets/main/figures/eq5.png", width: width))

公式(4)中，每一项都线性无关，说明每一项相互独立。当$d >> 2$时，$((d + 2)(d + 1)) / 2 approx (d / sqrt(2))^2$，显著放大了维度。
此过程与核函数类似。

#pagebreak()

= 多层star operation

假设网络宽度为$d$，$O_(l)$代表第$l$个star operation：

#align(center, image("assets/main/figures/eq6-eq10.png", width: 60%))

其中公式(6)来自于公式(3)。

比如当$d = 128$时，经过10次计算，将产生$(d / sqrt(2))^(2^(128)) approx 90^(1024)$个维度的特征空间。

这说明，通过star operation，可以通过几次运算就将特征映射到一个非常高维度的非线性空间。

#pagebreak()

= $(W_(1)^(T)X + B_(1)) * (W_(2)^(T)X + B_(2))$的特殊情况

#v(1em)

== $W_(1)$或者$W_(2)$非线性

这种情况下，隐维度没有发生变化($d^(2) / 2$)，因此对上述分析无影响，因此可以作为一种线性变换来分析。

#v(1em)

== $W_(1)^(T)X * X$，即移除了$W_(2)$

隐维度将从$d^(2) / 2$降到$2d$

#v(1em)

== $X * X$

比如假设特征空间为${x^(1), x^(2), ..., x^(d)} in RR^(d)$，
经过这种方式将变为${x^(1)x^(1), x^(2)x^(2), ..., x^(d)x^(d)} in RR^(d)$

这种情况下可以作为前两种的结合特例，因此也能渐进式地得到高维度。

#pagebreak()

= star operation和sum operation的对比实验(DemoNet)

通过 @fig:demoblock 的DemoBlock搭建DemoNet，分别采用sum和star operation进行对比。

结论发现star operation比sum实验精度提升，并且在轻量模型上提升更多。

说明star operation的优势并不是因为模型变大造成的，而是因为能扩展到更高维度。

#{
  set align(center)
  let height = 65%
  grid(
    columns: (1fr, 1fr),
    image("assets/main/figures/tab10.png", height: height),
    image("assets/main/figures/tab2-tab3.png", height: height),
  )
}

#pagebreak()

= 决策边界可视化

在2D moon dataset上演示star operation和sum operation的区别如下

在此演示中，DemoNet移除了norm和conv，并且设置width=100和depath=4

#align(center, image("assets/main/figures/fig2.png", height: 55%))

发现star operation的决策边界更有效，并且和多项式核函数的作用非常相似

但不是来源于非线性，因为二者都有激活函数。因此依然说明是由于映射到了高特征空间

#pagebreak()

= star operation对于非线性能力的影响效果

#{
  set align(horizon)
  box[
    #align(center, image("assets/main/figures/tab4.png", height: 50%))

    对于DemoNet的star operation版本和sum operation版本，同时去掉激活函数(消除网络中的非线性部分)，
    发现star版本的精确度降低不大，而sum版本的降低很多

    说明star operation能提供非线性能力
  ]
}

#pagebreak()

= star operation的关键应用在什么地方？

== 消除激活函数层

之前实验表明star operation能够提供类似多项式核函数的效果，因此自带非线性能力，提供了替代激活函数的潜力。

== 自注意力和矩阵乘法

自注意力中的矩阵逐像素相乘实际上也类似(映射到高维度、非线性)，但是是全局范围交互。

区别在于，矩阵相乘改变了输入形状，因此需要其他操作调整向量形状(比如池化或者另外一轮矩阵乘法)，这个在star operation中可以避免。

== 隐高维度空间的系数分布优化

对于传统的神经网络，每个通道都能学习一个系数集合。

但在star operation中，学习到的每个隐维度的系数是固定值，这和多项式核函数类似。

比如多项式核函数$k(x_(1), x_(2)) = (gamma x_(1) dot x_(2) + c)^(d)$，系数分布可以通过超参数调整，在star operation中，也只提供有限的分布调整。
这和神经网络的“每个通道学习一个系数集合”不同。

#pagebreak()

= StarNet

#{
  let height = 75%
  set align(center)
  grid(
    columns: 2,
    gutter: 50pt,
    image("assets/main/figures/fig3.png", height: height),
    image("assets/main/figures/fig1-part-left.png", height: height)
  )
}

从Demo block修改得到。用BN替代了LN，用RELU6替换了GELU。在最后加了一个DWConv。

#pagebreak()

#{
  set align(center)
  grid(
    columns: (1fr, 1fr),
    {
      set align(left)
      [
        = StarNet对比实验参数与实验结果

        - 实验参数按照DeiT

        - Mobile GPU 是 iphone 13

        - GPU是P100

        实验结果右图，按照参数量排序$arrow.r$
      ]
      image("assets/main/figures/fig4.png", height: 59%)
    },
    image("assets/main/figures/tab6.png"),
  )
}

#let pb(numbering: template.numbering) = {
  pagebreak()
  heading(level: 1, [StarNet消融实验], numbering: numbering)
}

#pb()

#{
  set align(center)
  grid(
    columns: (1fr, 1fr),
    row-gutter: 1em,
    {
      set align(left)
      [
        == 逐渐替换star operation

        发现star operation对于前两层的影响不大。

        作者解释：对于前两层的宽度非常窄的情况，ReLU6导致一些特征变成0。而在star operation上下文中，导致许多高维度隐特征空间也变成0，因此限制了star operation的潜力。而后两层的通道数比较多(，比较容易发挥)。
      ]
    },
    {
      set align(center + horizon)
      image("assets/main/figures/tab7.png", height: 53%)
    },
    {
      set align(left)
      [
        == 不同平台上的延迟对比

        - 发现在Mobile GPU上，star operation比sum operation更快一点

        - 在GPU上，二者相差不大

        - 在CPU上，sum operation更快
      ]
    },
    {
      set align(center)
      image("assets/main/figures/tab8.png", height: 34%)
    }
  )
}

#pb(numbering: none)

#{
  set align(center)
  grid(
    columns: (1fr, 1fr),
    column-gutter: 20pt,
    {
      set align(left)
      [
        // #for _ in range(2) {
        //   counter(heading).step(level: 2)
        // }

        == 激活函数的位置

        $x_(1)$和$x_(2)$分别代表两个分支的输出。

        发现只提供其中一个分支的激活函数时，精度最高。
        同时也发现如果全部移除激活函数，精度比baseline依然提高了。
        说明star operation有可能能代替激活函数提供非线性能力。
      ]
    },
    {
      set align(center + horizon)
      image("assets/main/figures/tab9.png")
    },
  )
}

#{
  set align(left)
  [
    == star operation的块设计

    目前是$(W_(1)^(T)X) * (W_(2)^(T)X)$

    进一步尝试了$(W_(2)^(T)"act"(W_(1)^(T)X)) * X$，其中$W_(1) in RR^(d times d')$用于扩展宽度，$W_(2) in RR^(d' times d)$用于恢复至$d$，只改一个分支，另外一个分支不变。

    结果发现精度从78.4%降低至74.4%
  ]
}

// #pagebreak()
//
// = 附录
//
// #figure(
//   image("assets/main/figures/tab12.png", height: 75%),
//   caption: [StarNet实验参数],
//   kind: table
// )
